/**
 * 
 */
package due.pc.pcshoot.gamelogic;

import org.anddev.andengine.engine.camera.Camera;
import org.anddev.andengine.engine.handler.IUpdateHandler;
import org.anddev.andengine.entity.Entity;
import org.anddev.andengine.entity.scene.Scene;

import due.pc.pcshoot.control.Arrow;
import due.pc.pcshoot.entity.EnemyState;
import due.pc.pcshoot.entity.IEnemy;

/**
 * @author manhhung.vu
 *
 */
public class ArrowsLogicHandler implements IUpdateHandler
{
	//===============================================================/
	//Constants
	//===============================================================/
	
	
	//===============================================================/
	//Fields
	//===============================================================/
	private IEnemy[] mEnemies;
	private Arrow[] mArrows;
	private Camera mCamera;
	
	//===============================================================/
	//Constructors
	//===============================================================/
	public ArrowsLogicHandler(Arrow[] pArrows, IEnemy[] pEnemies, Camera pCamera, Scene pRegisterAt) 
	{
		mArrows = pArrows;
		mEnemies = pEnemies;
		mCamera = pCamera;
		
		for (Arrow arrow : pArrows) pRegisterAt.attachChild(arrow);
		
		pRegisterAt.registerUpdateHandler(this);
	}
	
	//===============================================================/
	//Inherited Methods
	//===============================================================/
	@Override
	public void onUpdate(float pSecondsElapsed) 
	{
		for (Arrow arrow : mArrows) 
		{
			int direction = arrow.getDirection();
			
			switch (direction) {
			case Arrow.DIRECTION_LEFT:
				if (isAnyEnemyOverLeft()) {
					if (!arrow.isActive()) arrow.setActive(true);
				}
				else if (arrow.isActive()) arrow.setActive(false);
				break;

			case Arrow.DIRECTION_RIGHT:
				if (isAnyEnemyOverRight()) {
					if (!arrow.isActive()) arrow.setActive(true);
				}
				else if (arrow.isActive()) arrow.setActive(false);
				break;
				
			case Arrow.DIRECTION_TOP:
				if (isAnyEnemyOverTop()) {
					if (!arrow.isActive()) arrow.setActive(true);
				}
				else if (arrow.isActive()) arrow.setActive(false);
				break;
				
			case Arrow.DIRECTION_BOTTOM:
				if (isAnyEnemyOverBottom()) {
					if (!arrow.isActive()) arrow.setActive(true);
				}
				else if (arrow.isActive()) arrow.setActive(false);

			}
		}
	}
	
	@Override
	public void reset() {
		// TODO Auto-generated method stub
		
	}
	
	
	
	//===============================================================/
	//Methods
	//===============================================================/
	private boolean isAnyEnemyOverLeft()
	{
		for (IEnemy enemy : mEnemies) {
			if (enemy.getState().equals(EnemyState.ACTIVE) && 
					enemy.getX() + enemy.getWidth() < mCamera.getMinX()) return true;
		}
		return false;
	}
	
	private boolean isAnyEnemyOverRight()
	{
		for (IEnemy enemy : mEnemies) {
			if (enemy.getState().equals(EnemyState.ACTIVE) &&
					enemy.getX() > mCamera.getMaxX()) return true;
		}
		return false;
	}
	
	private boolean isAnyEnemyOverTop()
	{
		for (IEnemy enemy : mEnemies) {
			if (enemy.getState().equals(EnemyState.ACTIVE) &&
					enemy.getY() + enemy.getHeight() < mCamera.getMinY()) return true;
		}
		return false;
	}
	
	private boolean isAnyEnemyOverBottom()
	{
		for (IEnemy enemy : mEnemies) {
			if (enemy.getState().equals(EnemyState.ACTIVE) &&
					enemy.getY() > mCamera.getMaxY()) return true;
		}
		return false;
	}

	//===============================================================/
	//Getters & Setters
	//===============================================================/
	
	
	//===============================================================/
	//Static Methods
	//===============================================================/
	
	
	//===============================================================/
	//Inner Classes
	//===============================================================/
}
